/**!
 *
 * Toast 信息提示 jQuery 插件工具。<br>
 * 由于 IE8 及以下版本作者没测试过，推荐 IE9 以上使用。<br>
 *
 * 参数说明：
 * 1.top：与顶部的距离。如果不填写，默认值 0px；
 * 2.msg：提示信息。支持换行，建议提示信息不要太长（35 字以内最好），否则会换行；
 * 3.type：提示类型，success-成功；warn-警告；error-错误。如果不填写，默认值 success；
 * 4.close：自动删除的毫秒数。如果不填写，默认值 3000。
 *
 * 使用示例：
 * 1.成功提示（这是默认提示）：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 成功",
 *		type : "success",
 *		close : 3000
 *	});
 *
 * 2.警告提示：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 警告",
 *		type : "warn",
 *		close : 3000
 *	});
 *
 * 3.错误提示：
 * $.toast({
 *		top : 5,
 *		msg : "Toast 错误",
 *		type : "error",
 *		close : 3000
 *	});
 *
 * @author ChenYong
 * @date 2016-04-08
 *
 */



(function ($) {
    /** 成功提示 */
    var successHtml = "<div class='toast-modal toast-modal-success'>成功提示放在这里！</div>";
    /** 警告提示 */
    var warnHtml = "<div class='toast-modal toast-modal-warn'>警告提示放在这里！</div>";
    /** 错误提示 */
    var errorHtml = "<div class='toast-modal toast-modal-error'>错误提示放在这里！</div>";
    /** 提示模态框的 jQuery 对象 */
    var $toastModal = $(".toast-modal");
    /** Timeout 间隔 ID */
    var timeoutIntervalId = null;
    /** 数字正则表达式 */
    var numberRE = /^[0-9]+$/i;

    /**
     *
     * 对象为空。
     *
     * @param o 对象
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-为空；</li>
     *    <li>false-不为空。</li>
     * </ol>
     *
     */
    function isNull(o) {
        try {
            if (($.type(o) === "undefined") || (o == null)) {
                return true;
            }

            return false;
        } catch (e) {
            return true;
        }
    }

    /**
     *
     * 对象不为空。
     *
     * @param o 对象
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-不为空；</li>
     *    <li>false-为空。</li>
     * </ol>
     *
     */
    function isNotNull(o) {
        return !isNull(o);
    }

    /**
     *
     * 字符串为空。
     *
     * @param str 字符串
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-为空；</li>
     *    <li>false-不为空。</li>
     * </ol>
     *
     */
    function isBlank(str) {
        try {
            if (($.type(str) === "undefined") || (str == null) || ($.type(str) !== "string") || ($.trim(str).length === 0)) {
                return true;
            }

            return false;
        } catch (e) {
            return true;
        }
    }

    /**
     *
     * 字符串不为空。
     *
     * @param str 字符串
     * @returns {Boolean} 是否为空：
     * <ol>
     *    <li>true-不为空；</li>
     *    <li>false-为空。</li>
     * </ol>
     *
     */
    function isNotBlank(str) {
        return !isBlank(str);
    }

    /**
     *
     * 判断变量是否为数字。
     *
     * @param o 变量
     * @returns {Boolean} 是否为数字：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     *
     */
    function isNumber(o) {
        try {
            return $.isNumeric(o);
        } catch (e) {
            return false;
        }
    }

    /**
     *
     * 判断非空变量是否为 jQuery 对象。
     *
     * @param o 变量
     * @returns {Boolean} 是否为 jQuery 对象：
     * <ol>
     *    <li>true-是；</li>
     *    <li>false-否。</li>
     * </ol>
     *
     */
    function is_jQueryObj(o) {
        try {
            return isNotNull(o) && isNotBlank(o.jquery);
        } catch (e) {
            return false;
        }
    }

    /**
     *
     * 显示提示信息。
     *
     * @param settings 配置
     *
     */
    $.toast = function (settings) {
        // 与顶部的距离
        settings.top = (isNull(settings.top) ? "0px" : settings.top);
        // 提示消息
        settings.msg = (isBlank(settings.msg) ? "提示" : settings.msg);
        // 提示类型
        settings.type = (isBlank(settings.type) ? "success" : settings.type);
        // 自动关闭，默认 3 秒后自动关闭
        settings.close = (isNumber(settings.close) ? settings.close : 3000);

        // 修复与顶部的距离
        if (isNumber(settings.top)) {
            settings.top = settings.top + "px";
        } else {
            if (isBlank(settings.top)) {
                settings.top = "0px";
            } else {
                if (numberRE.test(settings.top)) {
                    settings.top = settings.top + "px";
                }
            }
        }

        // 修复自动关闭
        if (settings.close <= 0) {
            settings.close = (3000 - 1000);
        } else if ((settings.close > 0) && (settings.close <= 2000)) {
            settings.close = 1000;
        } else {
            settings.close = (settings.close - 1000);
        }

        // 删除所有提示信息，从而保证共用一个 Toast
        $toastModal.remove();

        // 停止上一次的 Timeout
        if (isNotNull(timeoutIntervalId)) {
            clearTimeout(timeoutIntervalId);
        }

        // 警告提示
        if (settings.type === "warn") {
            $("body").append(warnHtml);

            $toastModal = $(".toast-modal-warn");

            // 错误提示
        } else if (settings.type === "error") {
            $("body").append(errorHtml);

            $toastModal = $(".toast-modal-error");

            // 成功提示
        } else {
            $("body").append(successHtml);

            $toastModal = $(".toast-modal-success");
        }

        // 设置 Toast 的信息
        $toastModal.html(settings.msg);
        // 设置 Toast 的位置
        $toastModal.css({
            "top": settings.top,
            "left": (($(window).width() - $toastModal.width()) / 2)
        });
        // 显示 Toast
        $toastModal.show();

        // 启动 Timeout
        timeoutIntervalId = setTimeout(function () {
            $toastModal.remove();
        }, settings.close);

        // 监听当窗口大小改变
        $(window).resize(function () {
            if (is_jQueryObj($toastModal)) {
                $toastModal.css({
                    "top": settings.top,
                    "left": (($(window).width() - $toastModal.width()) / 2)
                });
            }
        });
    };
})(jQuery);